package pers.zh.parking.common;

import java.util.List;
import java.util.Map;

import io.reactivex.Observable;
import pers.zh.parking.data.entity.Car;
import pers.zh.parking.data.entity.Evaluation;
import pers.zh.parking.data.entity.Notice;
import pers.zh.parking.data.entity.PageInfo;
import pers.zh.parking.data.entity.ParkRecord;
import pers.zh.parking.data.entity.ParkingLot;
import pers.zh.parking.data.entity.ParkingSpace;
import pers.zh.parking.data.entity.User;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.Query;

public interface ApiService {

    // 笔记本
    String APP_DOMAIN = "http://192.168.1.138:8091/parking/";
    // 台式
//    String APP_DOMAIN = "http://192.168.0.112:8091/parking/";
    // 花生壳
//    String APP_DOMAIN = "http://zhoujuncai.vicp.io:80/parking/";

    /**
     * 分页获取停车场信息
     * @return
     */
    @POST("lot/list")
    Observable<BaseResponse<PageInfo<ParkingLot>>> lotList(@Body PageInfo pageInfo);

    /**
     * 附近停车场列表
     * @param map
     * @return
     */
    @POST("lot/list/around")
    Observable<BaseResponse<List<ParkingLot>>> getLotsAround(@Body Map<String, Object> map);

    /**
     * 搜索停车场
     * @return
     */
    @POST("lot/list/search")
    Observable<BaseResponse<List<ParkingLot>>> searchLots(@Body Map<String, Object> map);

    /**
     * 预约车位
     * @param record
     * @return
     */
    @POST("parkRecord/reserve")
    Observable<BaseResponse> reserve(@Body ParkRecord record);

    /**
     * 取消预约
     * @param recordId
     * @return
     */
    @POST("parkRecord/reserve/cancel/{recordId}")
    Observable<BaseResponse> cancelReservation(@Path("recordId") long recordId);

    /**
     * 预约记录
     * @param userId
     * @return
     */
    @GET("parkRecord/reservations/{userId}/{status}")
    Observable<BaseResponse<List<ParkRecord>>> getReservations(@Path("userId") long userId, @Path("status") long status);

    /**
     * 开始泊车
     * @param recordId
     * @param carNo
     * @return
     */
    @POST("parkRecord/startPark/{recordId}")
    Observable<BaseResponse> park(@Path("recordId") long recordId, @Query("carNo") String carNo);

    /**
     * 支付完成
     * @param recordId
     * @return
     */
    @POST("parkRecord/pay/{recordId}")
    Observable<BaseResponse> pay(@Path("recordId") long recordId);

    /**
     * 登录
     * @param account password
     * @return
     */
    @POST("user/login")
    Observable<BaseResponse<User.Wrap>> login(@Query("account") String account, @Query("password") String password);

    /**
     * 注册
     * @return
     */
    @POST("user/sign_up")
    Observable<BaseResponse> signUp(@Body User user);

    /**
     * 用户车辆
     * @param userId
     * @return
     */
    @GET("car/list/{userId}")
    Observable<BaseResponse<List<Car>>> getCars(@Path("userId") String userId);

    /**
     * 增加汽车
     * @param car
     * @return
     */
    @POST("car/add")
    Observable<BaseResponse> addCar(@Body Car car);

    /**
     * 修改汽车
     * @param car
     * @return
     */
    @POST("car/update")
    Observable<BaseResponse> updateCar(@Body Car car);

    /**
     * 删除汽车
     * @param cars
     * @return
     */
    @POST("car/delete")
    Observable<BaseResponse> deleteCars(@Body List<Car> cars);

    /**
     * 通知列表
     * @return
     */
    @GET("notice/list")
    Observable<BaseResponse<List<Notice>>> getNotice();

    /**
     * 评价记录
     * @param userId
     * @return
     */
    @GET("eval/list/{userId}")
    Observable<BaseResponse<List<ParkRecord>>> getEvals(@Path("userId") int userId);

    /**
     * 评价
     * @param evaluation
     * @return
     */
    @POST("parkRecord/eval")
    Observable<BaseResponse> eval(@Body Evaluation evaluation);

    /**
     * 发布通知
     * @param notice
     * @return
     */
    @POST("notice/add")
    Observable<BaseResponse> addNotice(@Body Notice notice);

    /**
     * 修改通知
     * @param notice
     * @return
     */
    @POST("notice/update")
    Observable<BaseResponse> updateNotice(@Body Notice notice);

    /**
     * 删除通知
     * @param list
     * @return
     */
    @POST("notice/delete")
    Observable<BaseResponse> deleteNotice(@Body List<Notice> list);

    /**
     * 修改用户信息
     * @param user
     * @return
     */
    @POST("user/update")
    Observable<BaseResponse> updateUser(@Body User user);

    /**
     * 修改密码
     * @param user
     * @return
     */
    @POST("user/modify_pwd")
    Observable<BaseResponse> modifyPwd(@Body User user);

    /**
     * 修改车位状态
     * @param item
     * @return
     */
    @POST("space/update")
    Observable<BaseResponse> updateSpace(@Body ParkingSpace item);

    /**
     * 删除车位
     * @param item
     * @return
     */
    @POST("space/delete")
    Observable<BaseResponse> deleteSpace(@Body List<ParkingSpace> item);

    /**
     * 新增车位
     * @return
     * @param space
     */
    @POST("space/add")
    Observable<BaseResponse> addSpace(@Body ParkingSpace space);

    /**
     * 根据停车场id查询车位列表
     * @param lotId
     * @return
     */
    @GET("space/list/{lotId}")
    Observable<BaseResponse<List<ParkingSpace>>> getLotSpaces(@Path("lotId") long lotId);
}
